home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / usr / lib / metasploit / src / impurity / shelldemo / main.c < prev    next >
C/C++ Source or Header  |  2006-06-30  |  4KB  |  195 lines

  1. /*
  2.  * Copyright (c) 2004-2005 vlad902 <vlad902 [at] gmail.com>
  3.  * This file is part of the Metasploit Framework.
  4.  * $Revision: 1.2 $
  5.  */
  6.  
  7. #include <sys/types.h>
  8. #include <sys/wait.h>
  9. #include <stdlib.h>
  10. #include <unistd.h>
  11. #include <string.h>
  12. #include <errno.h>
  13. #include <stdio.h>
  14. #include <signal.h>
  15.  
  16. #include "cmd.h"
  17.  
  18.  
  19. void parse(char *, int *, char * []);
  20. void chomp(char *);
  21.  
  22. struct __cmdhandler
  23. {
  24.     char * cmd;
  25.     void (* handler)();
  26.     unsigned int arg_process;
  27.     unsigned int arg_min;
  28.     unsigned int arg_max;
  29. };
  30.  
  31. struct __cmdhandler handlerlist[] =
  32. {
  33.     { "help", &cmd_help, 1, 0, 0 },
  34.     { "fork", &cmd_fork, 1, 0, 0 },
  35.     { "exec", &cmd_exec, 0, 0, 0 },
  36.     { "system", &cmd_system, 0, 0, 0 },
  37.     { "quit", &cmd_quit, 1, 0, 0 },
  38.     { "exit", &cmd_quit, 1, 0, 0 },
  39.  
  40.     { "open", &cmd_open, 1, 1, 1 },
  41.     { "lseek", &cmd_lseek, 1, 3, 3 },
  42.     { "read", &cmd_read, 1, 1, 2 },
  43.     { "write", &cmd_write, 1, 1, 2 },
  44.     { "close", &cmd_close, 1, 1, 1 },
  45.     { "dup", &cmd_dup, 1, 1, 1 },
  46.     { "dup2", &cmd_dup2, 1, 2, 2 },
  47.  
  48.     { "ls", &cmd_ls, 1, 0, 1 },
  49.     { "getcwd", &cmd_getcwd, 1, 0, 0 },
  50.     { "chmod", &cmd_chmod, 1, 2, 2 },
  51.     { "chown", &cmd_chown, 1, 2, 2 },
  52.     { "chgrp", &cmd_chgrp, 1, 2, 2 },
  53.     { "chdir", &cmd_chdir, 1, 1, 1 },
  54.     { "mkdir", &cmd_mkdir, 1, 1, 2 },
  55.     { "rmdir", &cmd_rmdir, 1, 1, 1 },
  56.     { "rename", &cmd_rename, 1, 2, 2 },
  57.     { "unlink", &cmd_unlink, 1, 1, 1 },
  58.     { "chroot", &cmd_chroot, 1, 1, 1 },
  59.     { "link", &cmd_link, 1, 2, 2 },
  60.     { "symlink", &cmd_symlink, 1, 2, 2 },
  61.  
  62.     { "getid", &cmd_getid, 1, 0, 0 },
  63.     { "setuid", &cmd_setuid, 1, 1, 1 },
  64.     { "setgid", &cmd_setgid, 1, 1, 1 },
  65.  
  66.     { "kill", &cmd_kill, 1, 1, 2 },
  67.     { "getpid", &cmd_getpid, 0, 0, 0 },
  68.     { "getppid", &cmd_getppid, 0, 0, 0 },
  69.  
  70.     { "time", &cmd_time, 1, 0, 0, },
  71.     { "uname", &cmd_uname, 1, 0, 0 },
  72.     { "hostname", &cmd_hostname, 1, 0, 1 },
  73.     { "reboot", &cmd_reboot, 1, 0, 0 },
  74.     { "shutdown", &cmd_shutdown, 1, 0, 0 },
  75.     { "halt", &cmd_halt, 1, 0, 0 },
  76.  
  77.     { "lsfd", &cmd_lsfd, 1, 0, 0 },
  78.  
  79.     { "fchdir_breakchroot", &cmd_fchdir_breakchroot, 1, 1, 1 },
  80. };
  81.  
  82. #define    HANDLERLIST_SIZE    (sizeof(handlerlist) / sizeof(struct __cmdhandler))
  83. #define    MAX_ARGV    15
  84.  
  85. int main(void)
  86. {
  87.     int sig;
  88.  
  89. /* XXX: Big negative sbrk() to remove heap? */
  90.     for(sig = 1; sig <= 64; sig++)
  91.         signal(sig, SIG_IGN);
  92.  
  93.     signal(SIGCHLD, &sig_chld_waitpid);
  94.  
  95.     setvbuf(stdout, (char *)NULL, _IONBF, 0);
  96.     printf("--=[ Impurity Demo Shell ]=--\n");
  97.  
  98.     
  99.     while(1)
  100.     {
  101.         char cmd[2048];
  102.         char cmd_bak[sizeof(cmd)];
  103.         char * argv[MAX_ARGV];
  104.         int argc;
  105.  
  106.         int i, hit;
  107.         
  108.         printf("impurity demo > ");
  109.  
  110.         memset(cmd, 0, sizeof(cmd));
  111.         if(fgets(cmd, sizeof(cmd), stdin) == NULL)
  112.             exit(0);
  113.         chomp(cmd);
  114.         memcpy(cmd_bak, cmd, sizeof(cmd_bak));
  115.  
  116.         parse(cmd, &argc, argv);
  117.         if(argc == 0)
  118.             continue;
  119.  
  120.         for(hit = i = 0; i < HANDLERLIST_SIZE; i++)
  121.         {
  122.             if(strcmp(argv[0], handlerlist[i].cmd) == 0)
  123.             {
  124.                 hit = 1;
  125.  
  126.                 if(handlerlist[i].arg_process)
  127.                 {
  128.                     if(argc > handlerlist[i].arg_max+1)
  129.                         printf("%s: Too many arguments\n", argv[0]);
  130.                     else if(argc < handlerlist[i].arg_min+1)
  131.                         printf("%s: Too few arguments\n", argv[0]);
  132.                     else
  133.                         handlerlist[i].handler(argc, argv);
  134.                 }
  135.                 else
  136.                 {
  137.                     handlerlist[i].handler(cmd_bak + strlen(handlerlist[i].cmd) + 1);
  138.                 }
  139.             }
  140.         }
  141.  
  142.         if(hit == 0)
  143.         {
  144.             printf("%s: Unknown command.\n", argv[0]);
  145.         }
  146.     }
  147. }
  148.  
  149. void parse(char * str, int * const argc, char * argv[])
  150. {
  151.     *argc = 0;
  152.  
  153.     if(strlen(str) == 0)
  154.         return;
  155.  
  156.     for(argv[(*argc)++] = str; strlen(str) && *argc < MAX_ARGV; str++)
  157.     {
  158.         if(*str == ' ')
  159.         {
  160.             *str = '\0';
  161.             argv[(*argc)++] = str+1;
  162.         }
  163.         if(*str == '\\')
  164.         {
  165.             switch(*(str + 1))
  166.             {
  167. //                case 'n':
  168. //                    break;
  169.                 default:
  170.                     memmove(str, str+1, strlen(str));
  171.                     break;
  172.             }
  173.         }
  174.     }
  175. }
  176.  
  177. void chomp(char * str)
  178. {
  179.     if(strlen(str) > 0 && str[strlen(str) - 1] == '\n')
  180.         str[strlen(str) - 1] = '\0';
  181.     if(strlen(str) > 0 && str[strlen(str) - 1] == '\r')
  182.         str[strlen(str) - 1] = '\0';
  183. }
  184.  
  185.  
  186. void sig_chld_ignore(int signal)
  187. {
  188.     return;
  189. }
  190.  
  191. void sig_chld_waitpid(int signal)
  192. {
  193.     while(waitpid(-1, 0, WNOHANG) > 0);
  194. }
  195.